The tidycensus package, developed by Kyle Walker, is very convenient and easy to use package for making choropleth maps from United States Department of Census data, specifically from the Decennial and ACS Census reports. This package makes it possible to gather census variables and conveniently join those variables with “Census Geography” (i.e. aka “shapefiles”, or polygons.) Visualization, or plotting, maps can be done with separate packages.
library(tidyverse)
library(sf)
library(tidycensus)
library(leaflet)
library(mapview)Use the tidycensus package to gather Census data and join that data with Census geography (i.e. geometry, i.e. shapefiles, i.e. polygons). First, you will need to get a free Census API key. Kyle Walker’s Basic usage of tidycensus documents this process.
census_api_key("YOUR API KEY GOES HERE")
See also Kyle’s more detailed documentation for putting the key into your environment file. But skip that for the moment.
Create a Simple Features dataframe using tidycensus::get_acs()
The Census population variable we’ll use is “B01003_001”. More information about identifying Census variables is available at the bottom of this page.
nc_pop <-
get_acs(geography = "county",
variables = "B01003_001",
state = "NC",
geometry = TRUE)
Identify which variable will be used to create the color ramp shading. Assign this variable with the zcol argument. The estimate variable was extracted via the tidycensus::get_acs() function.
mapview(nc_pop, zcol = "estimate")Now we’ll geolocate the Starbucks stores and add those locations as a layer over our choropleth. The Starbucks locations were generated and plotted in the previous exercise. Here we regenerate the StarbuckNC object.
starbucks <- read_csv("data/All_Starbucks_Locations_in_the_US_-_Map.csv")Subset Starbucks Data to North Carolina
starbucksNC <- starbucks %>%
filter(State == "NC")Convert the starbuckNC dataframe to a spatial (sf) object and assign the same projection as the nc_pop spatial object.
starbucksNC <- st_as_sf(starbucksNC, coords = c("Longitude", "Latitude"), crs = st_crs(nc_pop))Generate the map with multiple layers. You can read more about additional arguments such as homebutton, legend, alpha, cex in the mapview() documentation. Read about the many more mapview functions in the full documentation.
mymap <- mapview(nc_pop,
zcol = "estimate",
homebutton = FALSE) +
mapview(starbucksNC,
zcol = "Name",
legend = FALSE,
alpha = 0.5, cex = 3,
col.regions = "orange",
homebutton = FALSE)
addLogo(mymap, "images/Rfun3.png",
position = "bottomright",
offset.x = 8,
offset.y = 38,
width = 100,
height = 100)Shift and re-scale Alaska and Hawaii for better cartographic display of the entire US.
population <- get_acs(geography = "state",
variables = "B01003_001",
geometry = TRUE,
shift_geo = TRUE)mapviewOptions(legend.pos = "bottomright")
mapviewOptions(leafletWidth = 800)
#mapviewOptions()
#mapviewOptions(default = TRUE)
mapview(population, zcol = "estimate", native.crs = TRUE, crs = 5070)During the workshop I will discuss the following concepts in more detail.
The Census is a very large collection of data. Many casual users of Census data are interested in a single data point, for example population by County. Given the complexity and richness of available Census data, finding a useful data variable can be quite a bit of work. The links below are a some methods one might use to identify the proper code name with a Census data variable.
In the tmap section of the Simple Features module we will use the tigris package to gather State level, Census geography shapefiles. Shapefiles are an important GIS data standard. There are many other standards, although shapefiles have a very broad user base. If you need shapefiles for other geographies, please consult our GIS Data: Starting Points guide – a very handy collection of GIS data sources, much of which will be in the shapefiles format.